一、操作符函数重载
	什么是操作符函数：在C++中针对类类型的对象的运算符，由于它们肯定不支持真正的运算符操作，因此编译器会将它们翻译成函数，这种就叫做操作符函数(运算符函数)
		
	编译器把运算符翻译成运算符函数，可以针对自定义的类类型设计它独有的运算功能。	
	其实各种运算符已经具备某些功能，再次实现它的就是叫作运算符重载。
	
	双目运算符：
	a+b
	成员函数
		a.operator+(b);
	全局函数
		operator+(a,b);
		
	单目运算符：
		！a
	成员函数
		a.operator!(void);
	全局函数
		operator!(a);
		
		
二、双目操作符函数重载
	成员函数：
		const 类对象 operator#(const 类& that)const
		{
			return 类(参数#参数);
		}
		
	注意：双目运算符的运算结果是个右值，所以返回值应该加const，然后为了const对象能够调用参数应写const，函数也应该具备const属性
	
		返回临时变量 类对象 后面不能加 不然return后会直接调用析构函数
	
	
	全局函数：
	const 类 operator#(const类& a,const类& b)
	{
	
	}
	注意：全局函数不是成员函数，可能会访问到类的私有成员，解决这种问题，可以把函数声明为类的友元函数 friend (友元不是成员)
	
	友元：在类的外部某个函数想访问类的私有成员(public/protected/private)时，需要所在的函数声明为友元，但友元只是朋友，因此它只有访问权，没有实际的拥有权(其根本原因是它没有this指针)
	
	友元声明：把函数的声明写一份到类中，然后在声明前加上friend关键字。
	
		注意：友元函数与成员函数不回构成重载 ，因为它们不在同一个作用域中
	
	
	使用友元既可以把操作符函数定义为全局的，也可以确保类的封装性。
	
三、赋值类型的双目操作符
		成员函数：
		类[&] operator#(void)
		{
		
		}
	
	全局函数：
	 类[&] operator#(const 类& that)
		{
		
		}
	1、区分单参构造与赋值运算的调用方式
	
	Point p = "sun" ;//会调用单参构造，而不会调用 赋值运算符
	str ="hehe";//调用赋值运算符
	
	
	2、左操作数据不能具有const属性
		1.成员函数不能是常函数(参数表与函数体之间没有const)
		2.全局函数第一个参数不能有const属性
	
		
	
	
四、单目操作符函数重载	
	-,~,!,&,*,->,.,++,--
	成员函数：
		const 类 operator#(void)const
		{
		
		}
	
	全局函数：
		const 类 operator#(const 类& that)
		{
		
		}
		
	前++/--
成员函数：
		类& operator#(void)
		{
		
		}
	
	全局函数：
		类& operator#(const 类& that)
		{
		
		}	
		
	后++/--(int为哑元)
成员函数：
		const 类 operator#(int)
		{
		
		}
	
	全局函数：
		const 类 operator#(类& that,int)
		{
		
		}
	
	

	
五、输入输出操作符重载
		cout是ostream类型的对象，cin是istream类型的对象。
		如果<</>>运算符实现为成员函数，那么调用者应该是以ostream/istream，而我们无权增加标准库的代码，因此输入输出运算符只能定义为全局函数。
		
		ostream& operator<<(ostream& os,const 类& n) 
		{
		
		}
	注意： 在输入输出过程中，cin/cout会记录错误标志，因此不能加const属性
	
	
	
	
	
	
	
六、特殊操作符的重载
	1.下标操作符 [] ，常用于在容器类型中以下标方式获取元素
	 类型&  operator[](int i)
	 {
		 
	 }
	
	2.函数操作符 ()，一个类如果重载了函数操作符，那么它的对象就可以像函数一个样使用，参数的个数，返回值类，可以不确定，
	它是唯一一个可以参数有缺省函数的操作符
	
	
	3.解引用操作符 * 、 成员访问操作符 ->  、
		如果一个类重载了*和->，那么它的对象就可以像指针一样使用。
		智能指针就是一种类对象，它支持解引用和成员访问操作符
		
		
	4.智能指针 
		
		常规指针的缺点：
				当一个常规指针离开它的作用域时，只有该指针所占用的空间会被释放，而它指向的内存空间不一定会被释放。在一些特殊情况下(人为、业务逻辑的特殊性)导致free或delete没有执行,会造成内存泄露。
	
		智能指针：是一个封装了常规指针的类类型对象，当它离开作用域时，其析构函数会自动执行，它的析构函数会负责释放常规指针所指向的动态空间
		动态内存(以正确方式创建的智能指针，它的析构函数才会正确执行)。
	
	
		智能指针和常规指针的相同点：都支持*和->运行。
	
	
		智能指针和常规指针的不同点： 任何时候，一个对象只能使用一个智能指针来指向，而常规指针可以指向多次。
									智能指针的赋值操作需要经过拷贝构造和赋值构造特殊处理(深拷贝)。
		
	
		auto_ptr:标准库中封装好的智能指针，实现了常规指针的基本功能 头文件 #include<memory>
			用法：auto_ptr<指向的类型> 指针变量名(对象的地址)
		
		auto_ptr的局限性：不能跨作用域使用，一旦离开作用域指针变量会被释放，它指向的对象也会释放。
						  不能放入标准容器
						  不能指向对象数组
	
	
	
	5. new/delete/new[]/delete[]运算符重载
		(1)C++缺省的堆内存管理器速度较慢，重载new/delete底层使用malloc/free可以提高运行速度。
		(2)new在失败时会产生异常，而每次使用new时为了安全都应该进行异常捕获，而重载new运算符，只需要在操作符函数中进行一次错误处理即可。
		(3)在一些占字节数比较小的类频繁使用new，可能会产生大量的内存碎片，而重载new操作后可以适当扩大每次申请的字节数，
		减少内存碎片产生的几率。
		(4)重载new/delete可以记录堆内存使用信息
		(5)重载delete可以检测到释放内存失败时的信息，检测到内存泄露
	
	
	
	
	关于操作重载的建议：
	1.在重载操作符时要根据操作符实际的功能和意义来确定具体参数返回值，是否具有const属性，返回值是否是引用或者是临时对象。
	2.重载操作符要符合情理(要有意义)，以实际用途为前提。
	3.重载操作符的意义是为了让对象的操作更简单方便，提高代码的可读性。
	4.重载操作符要追求一致，与现有默认的操作符的功能及运算规则基本一致。
	


七、重载操作符的限制
	1、 不能重载的操作符
		堆限定符 ::
		直接成员访问操作符 .
		三目运算？:
		字节长度操作符 sizeof 
		类型信息操作符 typeid
	
	2. 重载操作符不能修改操作符的优先级
	3. 不能无法重载所有基本类型的操作运算度
	4. 不能修改操作符的参数个数
	5. 不能发明新的操作符
	
	
	
	
	